// 分享工具类
const app = getApp()

class ShareUtil {
  // 缓存对象
  static shareConfigCache = {}
  static cacheExpireTime = 5 * 60 * 1000 // 缓存过期时间：5分钟

  // 获取分享配置
  static async getShareConfig(pageType, pageData = {}) {
    try {
      // 尝试从缓存获取
      const cachedConfig = this.getFromCache(pageType, pageData)
      if (cachedConfig) {
        return cachedConfig
      }

      // 调用后端接口获取分享配置
      const result = await this.requestShareConfig(pageType, pageData)
      
      if (result && result.success) {
        // 缓存配置
        this.setCache(pageType, pageData, result.data)
        return result.data
      }
      
      console.warn('后端返回的分享配置无效，使用默认配置')
      // 失败时返回默认配置
      const defaultConfig = this.getDefaultShareConfig(pageType, pageData)
      return defaultConfig
    } catch (error) {
      console.error('获取分享配置失败:', error)
      // 异常时返回默认配置
      const defaultConfig = this.getDefaultShareConfig(pageType, pageData)
      return defaultConfig
    }
  }

  // 请求后端分享配置
  static requestShareConfig(pageType, pageData) {
    return new Promise((resolve, reject) => {
      // 添加超时处理
      const timeout = setTimeout(() => {
        reject(new Error('请求超时'))
      }, 5000)

      wx.request({
        url: `${app.globalData.baseUrl}/api/share/config`,
        method: 'POST',
        data: {
          page_type: pageType,
          page_data: pageData
        },
        success: (res) => {
          clearTimeout(timeout)
          resolve(res.data)
        },
        fail: (err) => {
          clearTimeout(timeout)
          
          // 添加详细的错误信息
          console.error('网络请求失败，请检查网络配置:', {
            url: `${app.globalData.baseUrl}/api/share/config`,
            error: err
          })
          
          // 如果是体验版，给出相应提示
          const envVersion = __wxConfig.envVersion || 'release'
          if (envVersion === 'trial') {
            wx.showToast({
              title: '体验版网络配置错误',
              icon: 'none',
              duration: 3000
            })
          }
          
          reject(err)
        }
      })
    })
  }

  // 生成缓存键
  static generateCacheKey(pageType, pageData) {
    const dataStr = JSON.stringify(pageData)
    return `${pageType}_${dataStr}`
  }

  // 从缓存获取配置
  static getFromCache(pageType, pageData) {
    const cacheKey = this.generateCacheKey(pageType, pageData)
    const cacheItem = this.shareConfigCache[cacheKey]
    
    if (!cacheItem) return null
    
    // 检查是否过期
    if (Date.now() - cacheItem.timestamp > this.cacheExpireTime) {
      delete this.shareConfigCache[cacheKey]
      return null
    }
    
    return cacheItem.config
  }

  // 设置缓存
  static setCache(pageType, pageData, config) {
    const cacheKey = this.generateCacheKey(pageType, pageData)
    this.shareConfigCache[cacheKey] = {
      config,
      timestamp: Date.now()
    }
  }

  // 清除缓存
  static clearCache(pageType = null) {
    if (pageType) {
      // 清除特定页面类型的缓存
      Object.keys(this.shareConfigCache).forEach(key => {
        if (key.startsWith(pageType)) {
          delete this.shareConfigCache[key]
        }
      })
    } else {
      // 清除所有缓存
      this.shareConfigCache = {}
    }
  }

  // 获取默认分享配置
  static getDefaultShareConfig(pageType, pageData) {
    // 根据不同页面类型返回不同的默认配置
    switch (pageType) {
      case 'room':
        return {
          title: '快来加入我的牌局！',
          desc: '一起来玩打牌记账小程序，在线记账，方便快捷',
          path: `/pages/index/index`,
          imageUrl: '' // 可以设置默认图片
        }
      case 'settlement':
        return {
          title: '牌局结算详情',
          desc: '查看本次牌局的详细结算信息',
          path: `/pages/index/index`,
          imageUrl: ''
        }
      default:
        return {
          title: '打牌记账小程序',
          desc: '专业记账工具，轻松记录牌局输赢',
          path: `/pages/index/index`,
          imageUrl: ''
        }
    }
  }

  // 生成分享到好友的配置
  static async generateShareAppMessageConfig(pageType, pageData = {}) {
    const config = await this.getShareConfig(pageType, pageData)
    return {
      title: config.title,
      path: config.path,
      imageUrl: config.imageUrl,
      success: (res) => {
        console.log('分享成功:', res)
        // 可以在这里添加分享成功的统计逻辑
      },
      fail: (err) => {
        console.error('分享失败:', err)
      }
    }
  }

  // 生成分享到朋友圈的配置
  static async generateShareTimelineConfig(pageType, pageData = {}) {
    const config = await this.getShareConfig(pageType, pageData)
    return {
      title: config.title,
      query: config.path.split('?')[1] || '',
      imageUrl: config.imageUrl,
      success: (res) => {
        console.log('分享到朋友圈成功:', res)
        // 可以在这里添加分享成功的统计逻辑
      },
      fail: (err) => {
        console.error('分享到朋友圈失败:', err)
      }
    }
  }
  // 测试网络连接
  static testNetworkConnection() {
    return new Promise((resolve, reject) => {
      wx.request({
        url: `${app.globalData.baseUrl}/health`,
        method: 'GET',
        timeout: 5000,
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(true)
          } else {
            reject(new Error(`服务器返回状态码: ${res.statusCode}`))
          }
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }
}

module.exports = ShareUtil